AWS CloudFormation テンプレートを作ってもらおう!

AWS CloudFormation テンプレートを作ってもらおう!

こんにちは!Koty-Mousa 矢坂幸太郎 です!
今回は、生成AI を使って CloudFormation テンプレートを作ってみました!

なお、CloudFormation については 下記記事をご覧ください
https://dev.classmethod.jp/articles/introduction-2024-aws-cloudformation/

CloudFormation テンプレートを作ってもらおう!

今回は、前回の記事で紹介した「踏み台サーバ」構成の検証用環境を作成するテンプレートを作成します。

mrf7ih6gmtywlr9o7e8y

あらかじめ...

あらかじめ、キーペアの作成を行う必要があります。
今回は、DevIO-CF-Key-A と DevIO-CF-Key-B を設定しました。

キーペアは、作成時のみダウンロードできるため、今回の検証用としては CloudFormation でキーペアを作成するよりも安全かつ簡単にキーを受け取ることができるため、この方法を採用しました。

Claude に聞いてみよう!

今回は、Claude 3.5 Sonnet v2 (via AI-Starter)を用います

最初は より短い文章でしたが、AWSコンソールで複数のエラーが返されてしまったたため、エラーを出さないような注意文を付け足しています。
また、OSやインスタンスタイプは、指定しないと 誤ったOSなどを使用することがあります。
必要な情報はユーザが提供することが大切です。

「AI-Starter」では、画像の入力が可能なため(※1)前回作成した構成図を添付して、下記質問を行います。

mrf7ih6gmtywlr9o7e8y

この画像のような形のCloudFormationテンプレート・完全版を作成してください。
キーペアは、DevIO-CF-Key-A・DevIO-CF-Key-B を使用します。

  • OS: Amazon Linux 2023 ami-0ab02459752898a60
  • インスタンスタイプ: t3.micro
  • リージョン: ap-northeast-1
  • セキュリティグループ: 必要なものだけ(全開放は禁止です)
  • CIDRブロック: 適切なものを選択してください

インスタンス名は

  • A(パブリック)DevIO-Bastion
  • B(プライベート)DevIO-Private

可能な限り最新版を用いてください

Invalid template resource property 'Default' エラーに注意してください
EC2インスタンスのプロパティに直接AssociatePublicIpAddressを指定するのではなく、NetworkInterfacesを使用してください

パラメータで、My IP を「x.x.x.x」形式で指定させます。「/32」はユーザに入力させないでください

※ami含め、上記は東京(ap-northeast-1)リージョン・2024年12月現在の情報です。
お客様の要件に合わせて、最新の情報で実施してください。

(※1)アシスタントの種類によっては、画像の添付ができない場合があります


そして、下記結果が返ってきました

こちらをクリックして表示
AWSTemplateFormatVersion: '2010-09-09'
Description: 'VPC with Public and Private EC2 instances'

Parameters:
  MyIpAddress:
    Description: Your IP address (x.x.x.x format)
    Type: String
    AllowedPattern: '^([0-9]{1,3}\.){3}[0-9]{1,3}$'
    ConstraintDescription: Must be a valid IP address in x.x.x.x format

Resources:
  # VPC
  VPC:
    Type: AWS::EC2::VPC
    Properties:
      CidrBlock: 10.0.0.0/16
      EnableDnsHostnames: true
      EnableDnsSupport: true
      Tags:
        - Key: Name
          Value: DevIO-VPC

  # Internet Gateway
  InternetGateway:
    Type: AWS::EC2::InternetGateway
    Properties:
      Tags:
        - Key: Name
          Value: DevIO-IGW

  AttachGateway:
    Type: AWS::EC2::VPCGatewayAttachment
    Properties:
      VpcId: !Ref VPC
      InternetGatewayId: !Ref InternetGateway

  # Subnets
  PublicSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.0.0/24
      AvailabilityZone: !Select [0, !GetAZs '']
      MapPublicIpOnLaunch: true
      Tags:
        - Key: Name
          Value: DevIO-Public-Subnet

  PrivateSubnet:
    Type: AWS::EC2::Subnet
    Properties:
      VpcId: !Ref VPC
      CidrBlock: 10.0.1.0/24
      AvailabilityZone: !Select [0, !GetAZs '']
      Tags:
        - Key: Name
          Value: DevIO-Private-Subnet

  # Route Tables
  PublicRouteTable:
    Type: AWS::EC2::RouteTable
    Properties:
      VpcId: !Ref VPC
      Tags:
        - Key: Name
          Value: DevIO-Public-RT

  PublicRoute:
    Type: AWS::EC2::Route
    DependsOn: AttachGateway
    Properties:
      RouteTableId: !Ref PublicRouteTable
      DestinationCidrBlock: 0.0.0.0/0
      GatewayId: !Ref InternetGateway

  PublicSubnetRouteTableAssociation:
    Type: AWS::EC2::SubnetRouteTableAssociation
    Properties:
      SubnetId: !Ref PublicSubnet
      RouteTableId: !Ref PublicRouteTable

  # Security Groups
  BastionSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for Bastion host
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          CidrIp: !Sub ${MyIpAddress}/32
      Tags:
        - Key: Name
          Value: DevIO-SG-Bastion

  PrivateSecurityGroup:
    Type: AWS::EC2::SecurityGroup
    Properties:
      GroupDescription: Security group for Private instance
      VpcId: !Ref VPC
      SecurityGroupIngress:
        - IpProtocol: tcp
          FromPort: 22
          ToPort: 22
          SourceSecurityGroupId: !Ref BastionSecurityGroup
      Tags:
        - Key: Name
          Value: DevIO-SG-Private

  # EC2 Instances
  BastionInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0ab02459752898a60
      InstanceType: t3.micro
      KeyName: DevIO-CF-Key-A
      Tags:
        - Key: Name
          Value: DevIO-Bastion
      NetworkInterfaces:
        - DeviceIndex: 0
          SubnetId: !Ref PublicSubnet
          GroupSet: 
            - !Ref BastionSecurityGroup
          AssociatePublicIpAddress: true

  PrivateInstance:
    Type: AWS::EC2::Instance
    Properties:
      ImageId: ami-0ab02459752898a60
      InstanceType: t3.micro
      KeyName: DevIO-CF-Key-B
      Tags:
        - Key: Name
          Value: DevIO-Private
      NetworkInterfaces:
        - DeviceIndex: 0
          SubnetId: !Ref PrivateSubnet
          GroupSet: 
            - !Ref PrivateSecurityGroup
          AssociatePublicIpAddress: false

Outputs:
  BastionPublicIP:
    Description: Public IP of Bastion Host
    Value: !GetAtt BastionInstance.PublicIp

  PrivateInstancePrivateIP:
    Description: Private IP of Private Instance
    Value: !GetAtt PrivateInstance.PrivateIp

AI-Starter には、コードをダウンロードする機能があります。
クリックしてダウンロードします。

スクリーンショット 2024-12-30 11.02.00 2

AWSコンソール CloudFront → スタック → スタックの作成 に移動し、先程ダウンロードしたファイルを アップロードします

スクリーンショット 2024-12-30 11.09.50 2

次の画面で スタック名 と 手元PCの IPアドレスを入力します。
スタック名はわかりやすい名前を設定してください。
手元PCの IPアドレスは、https://checkip.amazonaws.com/ などで調べることができます。

スクリーンショット 2024-12-30 11.11.51 2

以降の画面では、今回は特に設定を変更せず スタックを作成します。
すぐに、 EC2インスタンス や VPC など、先程のテンプレートで設定したリソースが自動で作成されます。

スタックの作成が完了しました!

スクリーンショット 2024-12-30 13.42.11 2

EC2画面 を確認すると、設定したインスタンスが作成されていることが確認できます。
「Private」には パブリックIP が無く、「Bastion」は パブリックIP が付与されています。

スクリーンショット 2024-12-30 13.50.32

実際に、踏み台サーバ経由のアクセスに成功しました!

スクリーンショット 2024-12-30 14.08.29のコピー

なお、作成されたリソースは、CloudFormation スタックを削除することで、全て削除されます。
「DELETE_COMPLETE」表示を確認してください。

今回は、生成AIで CloudFormation テンプレートを作りました!
AWS利用に大変有効で便利だと感じました。今後も様々なやり方を探求していきます。

PR:AI-Starterって何?

本ブログで利用している Claude は、Anthropic のサイトから Claude を利用しているわけではありません。
クラスメソッドが法人向けに提供する生成AI環境構築サービス、AI-Starterを利用しております!
こちらは、クラスメソッドグループの社員も利用しております。

スクリーンショット 2024-12-30 15.02.10 2

Claude だけではなく、ChatGPT、Geminiといった、複数の生成AIサービスを1つのプラットフォームでシームレスに、そして安全に利用できるサービスです。

「そもそもどんな業務に生成AIを活用できるかが分からない」という会社様も、ぜひ下記ページをご覧ください!

https://classmethod.jp/services/generative-ai/ai-starter/


AIに頼りきらない

生成AI 使用時の非常に重要な点として、「AIの出力をそのまま鵜呑みにしない」ことがあります。弊社ガイドラインには『文章生成AIが生成する文章は、内容が正しくない場合があることを認識して利用すること』と記載があります。
現在、Claude をはじめ多くの生成AIは非常に良い結果を返していますが、時に正しくない結果を返すことがあります。
私が時々遭遇するのは、「プロンプト文・指示が不明瞭なため、AIが指示を誤った解釈をしてしまった」ことです。

また、「ハルシネーション」と呼ばれる、誤った情報をまるで本当かのように返答するケースを見かけることがあります。
今回の「エラーを返す(間違いが含まれる)CloudFrontテンプレート」も、ハルシネーションの一種です。

AIの出力は、問題がないことをご自身で確認の上、利用するようにしましょう。

弊社内ガイドラインは、下記ブログをご覧ください

https://dev.classmethod.jp/articles/guideline-for-use-of-ai-services/


ご覧いただきありがとうございました。
以上、Koty-Mousa 矢坂幸太郎 がお伝えしました!


The avatar, logo and name of "Koty-Mousa 矢坂幸太郎" and "Clamerus, dev. by Koty-Mousa" (include inconsistent/abbreviation spelling) are owned and copyrighted by Koty-Mousa (individually).

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。当社は様々な職種でメンバーを募集しています。「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.